//4．编写一个程序，创建一个有两个成员的结构模板：　　
//a．第1个成员是社会保险号。
// 第2个成员是一个有3个成员的结构，第1个成员代表名，第2个成员代表中间名，第3个成员表示姓。
//创建并初始化一个内含5个该类型结构的数组。
//该程序以下面的格式打印数据：　　
//Dribble, Flossie M. –– 302039823 　 　
//如果有中间名，只打印它的第1个字母，后面加一个点（.）；
//如果没有中间名，则不用打印点。编写一个程序进行打印，把结构数组传递给这个函数。　　
//b．修改a部分，传递结构的值而不是结构的地址。
#include <string.h>
#include <stdio.h>

struct sosecu {
    long numb;
    struct {
        char fname[20];
        char mname[20];
        char lname[20];
    };
};

static printf_sosecu_a(struct sosecu *ss, int size);

static printf_sosecu_b(struct sosecu ss[], int size);

int main(void) {
    struct sosecu ss[5] = {
            {302039823, "Dribble", "M", "Flossie"},
            {302039824, "Dribb",   "N", "Faossa"},
            {302039825, .fname="Eleen", .lname="Lius"},
            {302039826, .fname="Tom", .mname ="C", .lname="Aus"},
            {302039827, .fname="Jet", .lname="Alex"}
    };
    printf_sosecu_a(ss, 5);
    puts("");
    printf_sosecu_b(ss, 5);
    return 0;
}

static printf_sosecu_a(struct sosecu *ss, int size) {
    for (int i = 0; i < size; ++i, ss++) {
        if (strlen(ss->mname) == 0) {
            printf("%s,%s  –– %ld\n", ss->fname, ss->lname, ss->numb);
        } else
            printf("%s,%s %s.  –– %ld\n", ss->fname, ss->lname, ss->mname, ss->numb);
    }
}

static printf_sosecu_b(struct sosecu ss[], int size) {
    for (int i = 0; i < size; ++i) {
        if (strlen(ss[i].mname) == 0) {
            printf("%s,%s  –– %ld\n", ss[i].fname, ss[i].lname, ss[i].numb);
        } else
            printf("%s,%s %s.  –– %ld\n", ss[i].fname, ss[i].lname, ss[i].mname, ss[i].numb);
    }
}